#include "gps.h"
#include "log.h"

#define MAX_TRACK 100        // 最大轨迹点数
GPS_Point track[MAX_TRACK];  // 轨迹数组
int track_count = 0;         // 当前轨迹数量

/*

// 添加一个bool控制显示
static bool show_display = false;
void start_display(void) {
    show_display = true;
}

void stop_display(void) {
    show_display = false;
}

// 初始化 GPS：设置起始位置（如北京）
void gps_init() 
{
    track[0].lat = 39.9042;
    track[0].lon = 116.4074;
    track_count = 1;
    srand(time(NULL)); // 随机种子
    printf("📍 GPS 导航系统启动，起始位置: %.5f, %.5f\n\n", 
           track[0].lat, track[0].lon);
}


// 模拟 GPS 更新：小幅度随机移动
void gps_update() 
{
    // 检查轨迹数组是否已满，避免数组越界
    if (track_count >= MAX_TRACK) return;

    // 上一个点
    GPS_Point prev = track[track_count - 1];
    
    // 生成随机的位置变化量（模拟车辆移动）
    // (rand() % 200 - 100) 生成 -100 到 99 的随机数
    // 除以 100000.0 得到 ±0.001° 的变化范围
    double delta_lat = (rand() % 200 - 100) / 100000.0; // ±0.001°
    double delta_lon = (rand() % 200 - 100) / 100000.0;

    // 创建新的位置点，基于上一个点加上随机变化量
    GPS_Point new_point = {
        .lat = prev.lat + delta_lat,// 新纬度 = 旧纬度 + 变化量
        .lon = prev.lon + delta_lon // 新经度 = 旧经度 + 变化量
    };

    track[track_count++] = new_point;
    printf("🧭 移动到: %.5f, %.5f\n", 
        new_point.lat, new_point.lon);
}

// 显示完整轨迹（只显示前10个点，避免刷屏）
void gps_show_track() 
{
    //printf("\n🗺️  轨迹记录 (%d 个点):\n", track_count);
    int show = (track_count < 10) ? track_count : 10;
    for (int i = 0; i < show; i++) 
    {
        if(show_display)
        {
        printf("  %2d: %.5f, %.5f\n", 
            i+1,// 点编号（从1开始）
            track[i].lat, 
            track[i].lon);
        }
    }
    // 如果轨迹点超过10个，显示省略号提示还有更多点
    if (track_count > 10) printf("  ...\n");
}

void gpsmoni()
{
    log_init();
     // 模拟行驶：每秒“移动”一次，共8次
    for (int i = 0; i < 8; i++) 
    {
        gps_update();
        sleep(1); // 每秒更新一次（Linux/Unix）
        log_gps(track[i].lat, track[i].lon);
    }
    gps_show_track(); // 显示轨迹
    log_close();
}

*/

// 显示控制标志
static int show_gps_display = 0;

void start_gps_display(void) 
{
    show_gps_display = 1;
}

void stop_gps_display(void) 
{
    show_gps_display = 0;
}

// 初始化 GPS
void gps_init() 
{
    //初始位置
    track[0].lat = 39.9042;
    track[0].lon = 116.4074;
    track_count = 1;
    srand(time(NULL));//随机种子
    
    // 记录起始位置到日志
    log_gps(track[0].lat, track[0].lon);
}

// GPS 更新
void gps_update() 
{
    // 安全检查：如果轨迹数组已满，则不再添加新点
    // 防止数组越界访问，确保程序稳定性
    if (track_count >= MAX_TRACK) return;

    // 获取上一个轨迹点的位置信息
    GPS_Point prev = track[track_count - 1];

    // 生成随机的位置变化量（模拟车辆移动）
    // (rand() % 200 - 100) 生成 -100 到 99 的随机整数
    // 除以 100000.0 得到 ±0.001° 的变化范围（约±111米）
    double delta_lat = (rand() % 200 - 100) / 100000.0;
    double delta_lon = (rand() % 200 - 100) / 100000.0;

    // 创建新的位置点，基于上一个点加上随机变化量
    GPS_Point new_point = 
    {
        .lat = prev.lat + delta_lat,
        .lon = prev.lon + delta_lon
    };

    // 将新位置点添加到轨迹数组中，并增加轨迹点计数
    track[track_count++] = new_point;
    
    // 持续记录到日志，但不打印到终端
    log_gps(new_point.lat, new_point.lon);
    
    // 只有在显示开启时才打印到终端
    if (show_gps_display) 
    {
        printf("🧭 移动到: %.5f, %.5f\n", new_point.lat, new_point.lon);
    }
}

// 显示最近轨迹
void gps_show_track() 
{
    // 安全检查：如果显示功能未开启，直接返回不执行任何操作
    if (!show_gps_display) return;
    
    printf("\n🗺️  最近GPS轨迹 (%d 个点):\n", track_count);
    
    // 显示最近8个点，如果没有8个就显示全部
    int show_count = (track_count < 8) ? track_count : 8;
    int start_index = (track_count > 8) ? track_count - 8 : 0;
    
    // 循环显示选定的轨迹点
    for (int i = start_index; i < track_count; i++) 
    {
        printf("  %2d: %.5f, %.5f\n", 
            i + 1, track[i].lat, track[i].lon);
    }
    
    // 如果轨迹点总数超过8个，显示省略号提示用户还有更多点
    if (track_count > 8) 
    {
        printf("  ... (共%d个轨迹点)\n", track_count);
    }
}

// GPS监控函数（用于菜单选择）
void gpsmoni()
{
    // 开启显示
    start_gps_display();
    
    printf("\n=== GPS轨迹显示 ===\n");
    printf("显示最近8个GPS位置点\n");
    
    // 显示当前轨迹
    gps_show_track();
    
    printf("\n按回车键返回主菜单...\n");
    getchar();
    
    // 关闭显示
    stop_gps_display();
}